/**
    strcpy和memcpy主要有以下3方面的区别。
    1、复制的内容不同。strcpy只能复制字符串，而memcpy可以复制任意内容，例如字符数组、整型、结构体、类等。
    2、复制的方法不同。strcpy不需要指定长度，它遇到被复制字符的串结束符"\0"才结束，所以容易溢出。memcpy则是根据其第3个参数决定复制的长度。
    3、用途不同。通常在复制字符串时用strcpy，而需要复制其他类型数据时则一般用memcpy。

**/
#include "../algorithm.h"
#include "single_link_list.h"

Node head;
int node_count;

//初始化链表
void sl_init(){
    head = NULL;
    node_count = 0;
}

//打印链表
void sl_print(Node head){
    Node node = head;
    for(;node != NULL; ){
        printf("%d,",node->num);
        node = node->next;
    }
    printf("\n");
}

Node sl_get(){
    return head;
}

//增加节点(在结尾
void sl_add(Node node){
    Node tmp;
    Node cur_node;
    tmp = malloc(sizeof(struct node));
    if(tmp == NULL){
        return;
    }
    tmp = memcpy(tmp, node, sizeof(struct node));
    if(head == NULL){
        head = tmp;
        return;
    }
    cur_node = head;
    while(1){
        if(cur_node->next == NULL){
           cur_node->next = tmp;
           break;
        }
        cur_node = cur_node->next;
    }
}

//删除节点
void sl_del(Node node){
    Node cur_node;
    Node pre_node;
    if(head == NULL){
        return;
    }
    cur_node = head;
    pre_node = NULL;
    while(1){
        if(cur_node == NULL){
            break;
        }
        if(cur_node->num == node->num){
            pre_node->next = cur_node->next;
            break;
        }
        pre_node = cur_node;
        cur_node = cur_node->next;
    }
}